package main

import "fmt"

/*
【1】切片(slice)是golang中一种特有的数据类型
【2】数组有特定的用处，但是却有一些呆板(数组长度固定不可变)，所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的，切片是一种建立在数组类型之上的抽象，它构建在数组之上并且提供更强大的能力和便捷。
【3】切片(slice)是对数组一个连续片段的引用，所以切片是一个引用类型。这个片段可以是整个数组，或者是由起始和终止索引标识的一些项的子集。需要注意的是，终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。
【4】代码：
切片的语法：
var 切片名 []类型 = 数组的一个片段引用

切片有3个字段的数据结构：(结构体)
一个是指向底层数组的指针，一个是切片的长度，一个是切片的容量

*/

func main() {
	//定义一个数组
	var intArr [6]int = [6]int{3, 6, 9, 1, 4, 7}
	//切片构建在数组之上
	//定义一个切片名字为slice,[]动态变化的数组长度不写,int类型,intArr是原数组
	//[1:3]切片 - 切出的一段片段 - 索引:从1开始,到3结束(不包含3) - [1,3)
	var slice []int = intArr[1:3]
	//输出数组
	fmt.Println("intArr=", intArr)
	//输出切片
	fmt.Println("slice=", slice)
	//slice元素个数= 2
	//slice容量大小= 5
	//切片元素个数
	fmt.Println("slice元素个数=", len(slice))
	//获取切片的容量,容量可以动态变化(容量=长度*系数)
	fmt.Println("slice容量大小=", cap(slice))

	fmt.Println("---------------- ---------------- ----------------")

	fmt.Println("slice[1]=", slice[1])
	//切片是持有了数组地址的引用
	//相同元素的内存地址相同
	//数组中下标为1的地址= 0xc00000c398
	//切片中下标为0的地址= 0xc00000c398
	fmt.Printf("数组中下标为1的地址= %p", &intArr[1])
	fmt.Println()
	fmt.Printf("切片中下标为0的地址= %p", &slice[0])
	fmt.Println()
	slice[1] = 16
	fmt.Println("intArr=", intArr)
	fmt.Println("slice=", slice)

}
